package org.ala.tiktools.mybatis.executor;

import org.ala.tiktools.mybatis.commons.SqlSessionTemplateHolder;
import org.ala.tiktools.mybatis.spring.TikToolsMyBatisSpringContext;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.session.Configuration;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

/**
 * 独立执行方法
 * <p>  方法的namespace约定为MyBatis的方法key
 *
 * @author ala
 * @date 2025-03-09 15:10
 */
public class SqlSessionTemplateExecutor {


    static SqlSessionTemplateExecutor instance;
    /**
     *  单例
     */
    public static SqlSessionTemplateExecutor instance() {
        if (instance == null) {
            synchronized (SqlSessionTemplateExecutor.class) {
                if (instance == null) {
                    instance = new SqlSessionTemplateExecutor();
                }
            }
        }
        return instance;
    }


    /**
     *  执行方法并返回单个
     *  @param  appends 需要追加进参数中的map（会覆盖原@Param注解参数）
     */
    public <E> E selectOne(Method method, Object[] args, Map<String, Object> appends) {
        String name = namespace(method);
        Object param = ParameterConvert.instance().convert(method, args, appends);
        return SqlSessionTemplateHolder.getInstance().selectOne(name, param);
    }
    /**
     *  执行方法并返回列表
     */
    public <E> List<E> selectList(Method method, Object[] args, Map<String, Object> appends) {
        String name = namespace(method);
        Object param = ParameterConvert.instance().convert(method, args, appends);
        return SqlSessionTemplateHolder.getInstance().selectList(name, param);
    }


    /**
     *  取方法的命名空间
     */
    protected String namespace(Method method) {
        return String.format("%s.%s.%s", method.getDeclaringClass().getPackage().getName(), method.getDeclaringClass().getSimpleName(), method.getName());
    }
}
